package com.sh.data.engine.domain.common.service;

import com.sh.data.engine.domain.common.model.domain.SimpleTableFieldDomain;
import com.sh.data.engine.domain.integration.offline.model.domain.OfflineSyncRedisDomain;
import com.sh.data.engine.domain.shims.db.BaseDbManager;
import com.sh.data.engine.domain.shims.db.model.FieldInfoDomain;
import com.sh.data.engine.domain.shims.db.model.TableInfoDomain;
import com.sh.data.engine.job.admin.core.model.XxlJobGroup;
import com.sh.data.engine.repository.dao.integration.datasource.entity.DataSourceEntity;
import com.sh.data.engine.repository.dao.workspace.manager.entity.StorageEntity;

import java.util.List;

/**
 * @author: mengzheng.mhc
 * @date: 2024/6/19 13:40
 */
public interface CommonService {
    /**
     * description 获取工作空间默认存储的DbManager
     *
     * @author : mingxi.xpb
     * @date : 2022/1/14 11:25
     */
    BaseDbManager getStorageDbManagerByProjctId(Long projectId);

    /**
     * 获取数据集成引擎内置的postgresql
     *
     * @return
     */
    BaseDbManager getPgManager();

    /**
     * 获取默认存储信息
     *
     * @param projectId
     * @return
     */
    StorageEntity getStorage(Long projectId);

    /**
     * 根据项目id获取默认存储的表列表（临时）
     *
     * @param projectId
     * @return
     */
    List<TableInfoDomain> getTblsByProjectId(Long projectId);

    /**
     * 根据项目id，表名获取默认存储的指定表信息（临时）
     *
     * @param projectId
     * @param tblName
     * @return
     */
    TableInfoDomain getTblInfoByTblName(Long projectId, String tblName);

    /**
     * 根据项目id，表id获取默认存储的指定表信息（临时）
     *
     * @param projectId
     * @param tblId
     * @return
     */
    TableInfoDomain getTblInfoByTblId(Long projectId, Long tblId);

    /**
     * 根据项目id，表名前缀获取表信息及字段信息
     *
     * @param projectDId
     * @param prefix
     * @return
     */
    List<SimpleTableFieldDomain> getSimpleTableFieldInfoByProjectIdAndPrefix(
        Long projectDId, String prefix);

    SimpleTableFieldDomain getSimpleTableFieldInfo(Long projetId, Long tblId);

    List<FieldInfoDomain> getTableFieldListByTblId(Long projectId, Long tblId);

    /**
     * 获取数据集成引擎默认的xxl-job的执行器
     *
     * @return
     */
    XxlJobGroup getXxlDefaultGroup();

    DataSourceEntity getSystemDateSource(Long projectId);


    /**
     * 获取临时表的建表语句
     * source tablei
     *
     * @param offlineSyncRedisDomain
     */
    void getTempCreateTable(OfflineSyncRedisDomain offlineSyncRedisDomain);

    /**
     *
     */
    void executeChangeTable(OfflineSyncRedisDomain offlineSyncRedisDomain);

    void dropTmpTable(OfflineSyncRedisDomain offlineSyncRedisDomain);

    String getOfflineValue(String key);

    boolean isMemoryUsageBelowThreshold();


}
